package Offer;

import org.junit.Test;

/*
    输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字。

    题型：简单的模拟题
*/
public class T29_spiralOrder {

    @Test
    public void test() {
        int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        spiralOrder(matrix);
    }

    public int[] spiralOrder(int[][] matrix) {
        if (matrix == null || matrix.length == 0) { //加null的原因是防止访问matrix.length时出现空指针异常
            return new int[0];
        }

        int rowSt = 0;                    //矩阵的行前界
        int colSt = 0;                    //矩阵的列的前界
        int rowEn = matrix.length - 1;      //矩阵的行后界
        int colEn = matrix[0].length - 1; //矩阵的列后界

        int nums = (rowEn + 1) * (colEn + 1);  //矩阵元素总个数
        int res[] = new int[nums];         //存储结果的数组

        int index = 0;
        while (true) {
            //向右遍历
            for (int i = colSt; i <= colEn; i++) {
                res[index++] = matrix[rowSt][i];
            }
            //行前边界+1（因为该行已经遍历完成了）
            if (++rowSt > rowEn) {
                break;
            }

            //向下遍历
            for (int i = rowSt; i <= rowEn; i++) {
                res[index++] = matrix[i][colEn];
            }
            //列后边界-1
            if (--colEn < colSt) {
                break;
            }

            //向左
            for (int i = colEn; i >= colSt; i--) {
                res[index++] = matrix[rowEn][i];
            }
            //行后界-1
            if (--rowEn < rowSt) {
                break;
            }

            //向上
            for (int i = rowEn; i >= rowSt; i--) {
                res[index++] = matrix[i][colSt];
            }
            //列前界+1
            if (++colSt > colEn) {
                break;
            }
        }
        return res;

    }
}
